約 4,279,870 件
https://w.atwiki.jp/abwiki/pages/38.html
名称 |Select Case 読み |せれくとけーす 文法 |Select Case testexpression Case expression Case expression Case Else End Select 説明 |Gotoの上位版。 条件によって行き先を変える、 N88BASICのON X GoSubみたいなもの。 トリッキーな使用法もあり、「順番に判定して行き、1つでも当てはまればそこでキャッチする」という使い方がある。 例 Select Case -1 Case r 0 ... r 0ならば実行 Case t=0 ... t=0ならば実行 Case Else ... End Select
https://w.atwiki.jp/abwiki/pages/270.html
前回と同じ修正が必要。 またこのサンプルを実行するとレギストリに永遠に値が残るのでこれは重大な問題だと癒える。 前回に引き続き、メモリ監視ツールに、オプション項目を付け足してみます。 今回作成するプログラムのサンプルファイルを置いておきますので、参考にしたい方はどうぞ☆ SystemWatcher2.zip(プロジェクトに必要なファイルがすべて入っています) オプション項目って何をするの? 更新間隔の設定 最前面表示のオン/オフ 今回は、上記の2点と、それら設定項目のレジストリへの保存を試みます。 レジストリ操作 ① RegOpenKeyEx関数でレジストリキーをオープン ② RegQueryValueEx関数で値を読み込む / RegSetValueEx関数で値をセットする ③ RegCloseKey関数でレジストリキーを閉じる 各関数のパラメータの詳細は、ヘルプファイルでご確認下さい。 作り方☆ 前回のステップ27で作成したプロジェクトに手を加えていきます。 まず、MainWndのRAD画面を開き、下記のように、チェックボタン1つ、通常ボタン1つを挿入します。 次に、OptionButtonが押された時に表示するオプションダイアログを作ります。ProjectViewのMaterialタブ内のWindowフォルダを右クリックし、ウィンドウを挿入します。 OptionDlgにコントロールを挿入し、下の図のような構成に仕上げます。 MainWndのイベントコーディング ※太字は、前回からの変更点を表します。 ---------------------------------------------------------------------------- イベント プロシージャ ---------------------------------------------------------------------------- このファイルには、ウィンドウ [MainWnd] に関するイベントをコーディングします。 ウィンドウ ハンドル hMainWnd メモ - 以下の領域を、変数、構造体、定数、関数を宣言するための、 グローバル領域として利用することができます。 ----------------------------------ここから---------------------------------- Dim RenewalTiming As Long 更新間隔 ----------------------------------ここまで---------------------------------- ↑MainWnd.sbpの先頭部分には変更点はありません。RenewalTiming=500という行はあってもなくても構いません。 Sub MainWnd_Destroy() タイマーを終了する KillTimer(hMainWnd,0) ------------------------------ レジストリに設定値を書き込む ------------------------------ Dim hKey As HKEY Dim IsTopMost As Long 「常に手前に表示する」ボタンにチェックが入っているかどうかを調べる If SendMessage(GetDlgItem(hMainWnd,Check_TopMost),BM_GETCHECK,0,0) Then IsTopMost=1 Else IsTopMost=0 End If レジストリをオープン(サブキーが存在しなときは作成する) RegCreateKeyEx(HKEY_CURRENT_USER,"Software\SystemWatcher",0,NULL, _ REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,ByVal 0,hKey,0) 値 "IsTopMost" に変数 IsTopMost の内容をセットする RegSetValueEx(hKey,"IsTopMost",0,REG_DWORD,VarPtr(IsTopMost),Len(IsTopMost)) 値 "RenewalTiming" に変数 RenewalTiming の内容をセットする RegSetValueEx(hKey,"RenewalTiming",0,REG_DWORD,VarPtr(RenewalTiming),Len(RenewalTiming)) レジストリ ハンドルを閉じる RegCloseKey(hKey) SystemWatcher_DestroyObjects() PostQuitMessage(0) End Sub ↑Destroyイベントでは、設定内容のレジストリへの書き込みを行います。 Sub MainWnd_Create(ByRef CreateStruct As CREATESTRUCT) Dim buf As String Dim BufSize As Long Dim hProgBar As Long -------------------------------- レジストリから設定値を読み取る -------------------------------- Dim hKey As HKEY Dim IsTopMost As Long レジストリをオープン If RegOpenKeyEx(HKEY_CURRENT_USER,"Software\SystemWatcher", 0,KEY_ALL_ACCESS,hKey)=ERROR_SUCCESS Then 値 "IsTopMost" の内容を変数 IsTopMost にコピーする ※読み込みが失敗したときは自動的にIsTopMostの内容は0になる BufSize=Len(IsTopMost) RegQueryValueEx(hKey,"IsTopMost",0,0,VarPtr(IsTopMost),VarPtr(BufSize)) 値 "RenewalTiming" の内容を変数 RenewalTiming にコピーする BufSize=Len(RenewalTiming) If RegQueryValueEx(hKey,"RenewalTiming",0,0, VarPtr(RenewalTiming),VarPtr(BufSize)) ERROR_SUCCESS Then 読み込みが失敗したときは、デフォルト値の500にセットする RenewalTiming=500 End If レジストリを閉じる RegCloseKey(hKey) Else レジストリキーが存在しないときはデフォルト値をセットする IsTopMost=0 RenewalTiming=500 End If If IsTopMost Then IsTopMostの内容が0以外のときは、最前面ウィンドウにする SendDlgItemMessage(hMainWnd,Check_TopMost,BM_SETCHECK,BST_CHECKED,0) SetWindowPos(hMainWnd,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE Or SWP_NOSIZE) End If -------------------------- OSのバージョン情報を取得 -------------------------- Dim OsVerInfo As OSVERSIONINFO Dim BuildNum As Long OsVerInfo.dwOSVersionInfoSize=Len(OsVerInfo) GetVersionEx(OsVerInfo) If OsVerInfo.dwPlatformId=VER_PLATFORM_WIN32_WINDOWS Then Windows 9x系OS(メジャーバージョンは常に4) Select Case OsVerInfo.dwMinorVersion Case 0 buf="Windows 95" Case 10 buf="Windows 98" Case 90 buf="Windows Me" End Select BuildNum=LOWORD(OsVerInfo.dwBuildNumber) ElseIf OsVerInfo.dwPlatformId=VER_PLATFORM_WIN32_NT Then Windows NT系OS If OsVerInfo.dwMajorVersion=4 Then buf="Windows NT" ElseIf OsVerInfo.dwMajorVersion=5 Then If OsVerInfo.dwMinorVersion=0 Then buf="Windows 2000" ElseIf OsVerInfo.dwMinorVersion=1 Then buf="Windows XP" End If End If BuildNum=OsVerInfo.dwBuildNumber End If OS情報をウィンドウに表示する SetWindowText(GetDlgItem(hMainWnd,Static_OSName),buf) SetWindowText(GetDlgItem(hMainWnd,Static_OSBuildNum),Str$(BuildNum)) SetWindowText(GetDlgItem(hMainWnd,Static_OSNote),OsVerInfo.szCSDVersion) ------------------ メモリ情報を取得 ------------------ Dim MemStatus As MEMORYSTATUS Dim rate_Physical As Long, rate_Virtual As Long MemStatus.dwLength=Len(MemStatus) GlobalMemoryStatus(MemStatus) 物理メモリに関する情報を表示する rate_Physical=MemStatus.dwMemoryLoad SetWindowText(GetDlgItem(hMainWnd,Static_RatePhysical),Str$(rate_Physical)+"%") SetWindowText(GetDlgItem(hMainWnd,Static_TotalPhysical),Str$(Int(MemStatus.dwTotalPhys/1024))+"KB") SetWindowText(GetDlgItem(hMainWnd,Static_UsedPhysical),_ Str$(Int((MemStatus.dwTotalPhys-MemStatus.dwAvailPhys)/1024))+"KB") 仮想メモリに関する情報を表示する rate_Virtual= _ Int(CDbl(MemStatus.dwTotalPageFile-MemStatus.dwAvailPageFile)/CDbl(MemStatus.dwTotalPageFile)*100) SetWindowText(GetDlgItem(hMainWnd,Static_RateVirtual),Str$(rate_Virtual)+"%") SetWindowText(GetDlgItem(hMainWnd,Static_TotalVirtual),Str$(Int(MemStatus.dwTotalPageFile/1024))+"KB") SetWindowText(GetDlgItem(hMainWnd,Static_UsedVirtual),_ Str$(Int((MemStatus.dwTotalPageFile-MemStatus.dwAvailPageFile)/1024))+"KB") 物理メモリ使用率のプログレスバーの初期設定 SendMessage(GetDlgItem(hMainWnd,ProgressBar_Physical),PBM_SETRANGE,0,MAKELONG(0,100)) SendMessage(GetDlgItem(hMainWnd,ProgressBar_Physical),PBM_SETPOS,rate_Physical,0) 仮想メモリ使用率のプログレスバーの初期設定 SendMessage(GetDlgItem(hMainWnd,ProgressBar_Virtual),PBM_SETRANGE,0,MAKELONG(0,100)) SendMessage(GetDlgItem(hMainWnd,ProgressBar_Virtual),PBM_SETPOS,rate_Virtual,0) メモリ使用率のタイマーを設定(RenewalTiming秒間隔) SetTimer(hMainWnd,0,RenewalTiming,0) End Sub ↑Createイベントでは、レジストリの読み込みを行います。 Sub MainWnd_Timer(ByVal TimerID As Long) Dim MemStatus As MEMORYSTATUS Dim rate_Physical As Long, rate_Virtual As Long ------------------ メモリ情報を取得 ------------------ MemStatus.dwLength=Len(MemStatus) GlobalMemoryStatus(MemStatus) 物理メモリに関する情報を更新する rate_Physical=MemStatus.dwMemoryLoad SetWindowText(GetDlgItem(hMainWnd,Static_RatePhysical),Str$(rate_Physical)+"%") SetWindowText(GetDlgItem(hMainWnd,Static_UsedPhysical),_ Str$(Int((MemStatus.dwTotalPhys-MemStatus.dwAvailPhys)/1024))+"KB") 仮想メモリに関する情報を更新する rate_Virtual= _ Int(CDbl(MemStatus.dwTotalPageFile-MemStatus.dwAvailPageFile)/CDbl(MemStatus.dwTotalPageFile)*100) SetWindowText(GetDlgItem(hMainWnd,Static_RateVirtual),Str$(rate_Virtual)+"%") SetWindowText(GetDlgItem(hMainWnd,Static_UsedVirtual),_ Str$(Int((MemStatus.dwTotalPageFile-MemStatus.dwAvailPageFile)/1024))+"KB") プログレスバーの位置を設定 SendMessage(GetDlgItem(hMainWnd,ProgressBar_Physical),PBM_SETPOS,rate_Physical,0) SendMessage(GetDlgItem(hMainWnd,ProgressBar_Virtual),PBM_SETPOS,rate_Virtual,0) End Sub ↑Timerイベントに変更点はありません。 Sub MainWnd_Check_TopMost_Click() If SendMessage(GetDlgItem(hMainWnd,Check_TopMost),BM_GETCHECK,0,0) Then 最前面ウィンドウに設定する SetWindowPos(hMainWnd,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE Or SWP_NOSIZE) Else 最前面ウィンドウを解除する SetWindowPos(hMainWnd,HWND_NOTOPMOST,0,0,0,0,SWP_NOMOVE Or SWP_NOSIZE) End If End Sub ↑「常に手前に表示する」ボタンがクリックされたときのイベントです。SetWindowPos関数を使って、最前面ウィンドウのオン/オフを行っています。 Sub MainWnd_OptionButton_Click() Dim ret As Long オプション ダイアログ ボックスを表示する ret=DialogBox(hMainWnd,"OptionDlg") キャンセルボタンが押された時は抜け出す If ret=-1 Then Exit Sub 更新タイミングを変更 RenewalTiming=ret タイマーを再始動させる KillTimer(hMainWnd,0) SetTimer(hMainWnd,0,RenewalTiming,0) End Sub ↑「オプション」ボタンがクリックされたときのイベントです。DialogBox関数でOptionDlgを表示し、更新間隔の取得、設定を行います。 ここから下はOptionDlg.sbp内のコーディングになります。OptionDlgに関するイベントコーディングを行っていきます。 ---------------------------------------------------------------------------- イベント プロシージャ ---------------------------------------------------------------------------- このファイルには、ウィンドウ [OptionDlg] に関するイベントをコーディングします。 ウィンドウ ハンドル hOptionDlg メモ - 以下の領域を、変数、構造体、定数、関数を宣言するための、 グローバル領域として利用することができます。 ----------------------------------ここから---------------------------------- Sub SetDlgCenter(ByVal hOwner As Long, ByVal hDlg As Long) Dim OwnerRect As RECT, DlgRect As RECT Dim x As Long, y As Long GetWindowRect(hOwner,OwnerRect) メイン ウィンドウの座標を取得 GetWindowRect(hDlg,DlgRect) ダイアログボックスの座標を取得 新しい座標を計算 x=((OwnerRect.right-OwnerRect.left)-(DlgRect.right-DlgRect.left))/2 + OwnerRect.left y=((OwnerRect.bottom-OwnerRect.top)-(DlgRect.bottom-DlgRect.top))/2 + OwnerRect.top 位置を変更 SetWindowPos(hDlg,NULL,x,y,0,0,SWP_NOSIZE) End Sub ----------------------------------ここまで---------------------------------- ↑OptionDlg.sbpの先頭部分のコーディングです。SetDlgCenter関数には、指定したウィンドウを中央に配置する機能を持たせます。 Sub OptionDlg_Create(ByRef CreateStruct As CREATESTRUCT) ダイアログボックスを中央に表示する SetDlgCenter(hMainWnd,hOptionDlg) ラジオボタンの初期選択 Select Case RenewalTiming Case 100 SendMessage(GetDlgItem(hOptionDlg,RadioButton1),BM_SETCHECK,BST_CHECKED,0) Case 500 SendMessage(GetDlgItem(hOptionDlg,RadioButton2),BM_SETCHECK,BST_CHECKED,0) Case Else SendMessage(GetDlgItem(hOptionDlg,RadioButton3),BM_SETCHECK,BST_CHECKED,0) End Select End Sub ↑OptionDlgのCreateイベントです。RenewalTiming変数の内容を元に、ラジオボタンの初期化を行います。 Sub OptionDlg_OkButton_Click() Dim ret As Long 選択されているラジオボタンを調べる If SendMessage(GetDlgItem(hOptionDlg,RadioButton1),BM_GETCHECK,0,0) Then ret=100 ElseIf SendMessage(GetDlgItem(hOptionDlg,RadioButton2),BM_GETCHECK,0,0) Then ret=500 Else ret=1000 End If 戻り値に変数retの内容をセットする EndDialog(hOptionDlg,ret) End Sub ↑OptionDlgのOKボタンがクリックされたときのイベントです。選択されているラジオボタンを調べ、DialogBox関数の戻り値を設定します。この戻り値が、後に更新間隔を示すことになります。 Sub OptionDlg_CancelButton_Click() キャンセルが押された時は、戻り値に-1をセットする EndDialog(hOptionDlg,-1) End Sub ↑OptionDlgのキャンセルボタンがクリックされたときのイベントです。 これで作業は完了です。更新間隔の設定が正常に行われているかどうか、レジストリへの書き込み、読み込みが正常かどうかをチェックしてみましょう。
https://w.atwiki.jp/hamilton/pages/116.html
「ベイスターズ実況板」の親ページ。http //www.livebays.net/ 横浜実況板のスレたてルール 実況中の場合 レス番900をとった人が次スレを立てる。 雑談中の場合 レス番950をとった人が次スレを立てる。 実況雑談どちらのケースでもスレを立てる宣言を忘れずに。立てられなくても素直に申告。 新スレのレス1には前スレのURLを貼る。 タイトルのpart○の数字を増やすことも忘れずに。 スレ立ての際はsageは使わない。 実況版の利用はできるだけ2ch専用ブラウザで。 下記の実況板ルールにおいて、いくつか専ブラ(スマートフォン含む)の名前が挙がっているので参照してください。 livebays bot (livebays) on Twitterhttp //twitter.com/livebays (更新停止中) 機能 おかず機能 !star機能 名無し メール欄に sage と入れるとスレは上に上がりません。 kage 〃 真ん中に移動します。 dame 〃 一番下まで下がります。 dat落ちなどはかんりにんさんが管理されているので 2chのようなスレ埋め立ての必要はありません。 かんりにん ★さん直筆のlivebays横浜実況板ルール 16年度版 ☆☆2016横浜DeNA実況スレ 3/25 広島戦 part1☆☆ http //www.livebays.net/test/read.cgi/live/1458835365/ From [1] かんりにん ★ Date 2016/03/25(金) 01 02 45 波乱の船出!どうするラミちゃん、どうなるベイスターズ! 【このスレには試合開始前、スタメン発表までは書き込まないでください】 ★★実況中は900 それ以外のときは950を踏んだ方が次スレを立ててください★★ 実況には2ちゃんねる用ブラウザの使用を強く推奨します。 ↓実況用テンプレページはこちら http //www.livebays.net/score.html ↓わからない実況板用語はここで http //www38.atwiki.jp/hamilton/ From [2] かんりにん ★ Date 2016/03/25(金) 01 03 32 【この掲示板は】 当所は横浜DeNAベイスターズの試合を「実況」をする事を 目的として設置されている掲示板です。 利用者の皆様があれやこれやと盛り上がる場となってくれれば幸いです。 ただし、荒らし行為や悪質なデマ、度を越した誹謗中傷・煽りなど、 他の利用者に迷惑となる行為は禁止します。 そういった書き込みに対しては、実況板管理人(自分です)の判断で 予告無しに削除する場合があります。 また、書き込み規制も予告無し・報告無しに行う事もあります。 過度の名誉毀損や個人情報などの書き込みに対しては、 各プロバイダ・キャリアへの通報や プロバイダ責任制限法に基づき発信者情報の開示を行う場合があります。 あらかじめご了承ください。 荒らしはスルーしてください。反応すると荒らしに喜ばれます。 ここは2ちゃんねる掲示板ではありません。 2ちゃんねるのノリや独特の言葉使いなど嫌がられる場合が多いです。 くれぐれもご留意ください。 From [3] かんりにん ★ Date 2016/03/25(金) 01 03 50 【重要】 PCからのこの掲示板の閲覧、書き込みには「jane style」「Live2ch」などの サーバーに優しい2ちゃんねる用ブラウザを使うことを強く推奨します。 この板 http //www.livebays.net/live/ を外部板登録してください。 IEやFireFoxなど一般のWEBブラウザを使う事により発生するCGIの高負荷や転送量の増大は、 この板にとっての命取りになってしまいます。 また、レスの読み込みについては試合中など予告なく 2ちゃんねるブラウザ専用となる場合があります。ご注意ください。 【スマートフォン・タブレットをお使いの方】 iOS(iPhoneなど)の「BB2C」「twinkle」、Androidアプリの「2chmate」「2chgear」などで この板を外部板登録すると、読み書きともに可能です。ぜひご利用をお願いします。 (OSとソフトは最新版に更新が必須の場合があるようです。) もしこの板が何かの事態で使用不可能に陥った場合には、下記の板をお使いください。 実況予備板:http //yobi.livebays.net/cgi/baystars/ From [4] かんりにん ★ Date 2016/03/25(金) 01 04 09 【スレ立てのルール】 試合実況中は各スレッドの 900を踏んだ方が次のスレッドを立ててください。 それ以外の時間帯は 950を踏んだ方が立ててください。 何らかの事情で建てられない場合はその旨を書きこんでください。 その場合はどなたかが代理でお願いします。 スレッドを立てられなかったと言って、その方への叩き行為などはお止めください。 スレッドのタイトルは 「☆☆2016横浜DeNA実況スレ 3/25 広島戦 part1☆☆」 のようなフォーマットでお願いします。 一試合ごとに通し番号はリセットでお願いします。 試合終了後のスレ立ては 「☆☆2016横浜DeNA実況スレ 3/25 広島戦 エピローグpart1☆☆」 みたいな感じでお願いいたします。 試合前最初のスレ立ては、先発オーダー発表後に立てていただきたく。 (その前のスレッドが900に達してなくても構いません) From [5] かんりにん ★ Date 2016/03/25(金) 01 04 23 【お願い】 実況板は皆様のボランティア精神と義侠心の上に成り立っております。 試合をTVやラジオにてリアルタイムでご確認できる方がいらっしゃいましたら、 ぜひぜひ実況をお願いいたします。簡単な打席結果に関する情報でも助かります。 より詳しい実況をしていただけるありがたい方はこんなツールがあります。 http //eaglesaa.so.land.to/oboge/(大ちゃんといっしょ 実況ツール) http //www.livebays.net/score.html(スコアAAジェネレータ) ぜひぜひ何卒よろしくお願い申し上げます。 From [6] かんりにん ★ Date 2016/03/25(金) 01 04 37 【補足】 この掲示板は「横浜DeNAベイスターズ実況板」です。 試合時間外の雑談や多少の他球団ネタなどは否定しませんが、あくまで 「ベイスターズファンの、ベイスターズファンによる、ベイスターズファンの為の掲示板」 であり、あくまで「横浜ベイスターズを実況してあれやこれや盛り上がる板」 であるという事をご認識の上、ご利用いただくようお願いいたします。 あなたの書き込みをPCやモバイルの向こうで沢山の人々が読んでいる、という事を忘れないでください。 顔の見えない文字だけのコミュニケーションはちょっとの事で誤解やいさかいが起こりがちです。 その発言、その言葉使いが本当に恥ずかしくないものか。もう一度よく考えて書き込みましょう。 腹が立つこともあるかもしれませんが、同じ場所に集まったベイファン同士。仲良くしましょうよ。 何かご質問やご連絡などがありましたら http //www.livebays.net/test/read.cgi/live/1381491852/ まで。 From [7] かんりにん ★ Date 2016/03/25(金) 01 04 50 【かんりにんから一言】 この掲示板で実に15度目の開幕、そして6度目の監督交代となります。 新戦力の台頭に怪我人の発生、 さらには次々出てくる球界の暗いニュースなど いろいろと騒がしい中で迎える開幕戦です。 今いち、どうなるか分からない船出ですが 楽しみもあれば不安もあり、昨年の屈辱からの巻き返しはなるか。 今年は前半戦だけではなく後半戦も楽しみたい!切に願います。 今年もよろしくお願い致します。 IE使用について ☆☆ 06〜 07オフシーズン用雑談スレpart24☆☆ http //yobi.livebays.net/07ji/oflog/1162044302.html 44 :ホッシー君@修行中 :2006/10/28(土) 23 48 27 かんりにんさん> 雑談タイムも「IEはなるべくご遠慮」というルールは一緒でしょうか 試合実況の時はもちろんご遠慮だと思いますが・・・ 度々すいません、時々(昼間など)揉めることがあるようなので 「どっちかと言えば」的な裁定でもあったらありがたいと思うのですが 48 かんりにん@2006 ★ 2006/10/28(土) 23 50 30 44 そりゃ専ブラ使ってくれる方がありがたいです。強制はできませんが。 書き込みよりもレス読み込みの部分で特に 書き込む内容について ☆☆ 07オープン戦実況スレpart6(2/25〜)☆☆ http //yobi.livebays.net/07ji/op/1172382363.html 960 名前: かんりにん ★ 投稿日: 2007/02/25(日) 16 50 38 自分の書き込みの先には他の人間が読んでいるという事を意識した書き込みをお願いしたいっす ただ喧嘩腰で書き込みたいだけの人は他所いってください・・・ 解雇トレードネタについて ☆☆2004横浜実況スルッド4/18中日戦part3☆☆ http //yobi.livebays.net/04ji/4gatu/1082267882.html#R121 121 名前:かんりにん ★投稿日:2004/04/18(日) 15 07 31 あと、○○解雇とか○○トレードとかいうネタは予備板か2chでお願いします 野郎の裸に注意 ☆☆2009横浜実況スレ 7/21巨人戦 エピロ- part3☆☆ http //yobi.livebays.net/09ji/7gatu/1248179795.html#R596 596 :かんりにん ★ [] :2009/07/21(火) 23 49 08 だから野郎の裸には興味は無いんだよ!! 今日のログ見たら試合中に尻出してる男の画像のURL貼ってる書き込み発見して 今度はそっち系の荒らしかと対応しようと思ったぐらいだぜ 野球選手だとは思わんかった 624 :かんりにん ★ [] :2009/07/21(火) 23 54 35 まあそういう画像を貼って思う存分ハァハァしたいなら予備板でやっとくれ! かんりにんとの約束だ! 692 :ホッシー君@梅雨入り [] :2009/07/22(水) 00 05 15 イケメンネタと選手の裸ネタに食いつく人が多いのを見るにつけ 女性が結構多いんだなあとは思う 700 :ホッシー君@梅雨入り [] :2009/07/22(水) 00 06 13 692 選手の裸にはあんまり興味ないなあ 702 :ホッシー君@梅雨入り [] :2009/07/22(水) 00 06 52 692 女性の体はいくらでも資料あるんだけど 男だといい感じのはない・・・というか絶対数自体が少ないんだよな と資料として男性ヌードが欲しい自分が 726 :かんりにん ★ [] :2009/07/22(水) 00 10 20 692 まあ毎日そればっかりやられるようになったら、ちょっと考えますがねw 739 :ホッシー君@梅雨入り [] :2009/07/22(水) 00 12 00 726 禁止は勘弁してください>< 784 :かんりにん ★ [] :2009/07/22(水) 00 18 02 739 禁止というか二次元ネタ的な扱いですかね そっち系のネタは少人数で変に加速しているようなのが困り物で・・・ 800 :ホッシー君@梅雨入り [] :2009/07/22(水) 00 19 30 784 別の話題が出てもひたすらその話続ける人が多いってのもあるかも知れませんね 食いつく話題によりけりですが 嘘記事ネタ記事は勘弁 ベイスターズ球団売却検討話スレ3 http //www.livebays.net/bbs/test/read.cgi/live/1285987357/ 500 :かんりにん ★ [] :2010/10/03(日) 23 00 46 記事貼るんだったら最低限ソースがどこかぐらいは記載してください、お願いします 嘘記事やネタ記事はご勘弁ください 注ミャハウ☆ 過去に荒らしなど問題行為をしたレスのIPから書き込むと、レスの最後に「注ミャハウ☆」がつくことがある。 ☆☆2010横浜実況スレ 5/5 広島東洋戦 part1☆☆ http //yobi.livebays.net/10ji/5gatu/1273034034.html 58 名前:かんりにん ★ 投稿日:2010/05/05(水) 13 55 09 とりあえずNGワードを設定される方は「ミャハウ☆」でNGワードにするんじゃなくて「注ミャハウ☆」でNGワードにしていただければと お知らせ http //www.livebays.net/bbs/test/read.cgi/live/1065808763/ 804 :かんりにん ★ [sage] :2010/08/31(火) 22 47 08 基本的に構ってちゃん相手はスルーでお願いします ミャハウをつけたりアク禁してもリモホが変わる以上はいたちごっこでしかありませんし ご協力をお願いします
https://w.atwiki.jp/hamilton/pages/104.html
DailyLiveBay 右橋作成によるベイスターズ応援サイト(http //f45.aaa.livedoor.jp/~livebay/yb/)。 よく更新をサボります。
https://w.atwiki.jp/abwiki/pages/241.html
#include api_mmsys.sbp Declare Function waveOutOpen Lib "winmm" (phwo As *HWAVEOUT, uDeviceID As DWord, pwfx As *WAVEFORMATEX, dwCallback As DWord, dwInstance As DWord, fdwOpen As DWord) As MMRESULTDeclare Function waveOutClose Lib "winmm" (hwo As HWAVEOUT) As MMRESULTDeclare Function waveOutPrepareHeader Lib "winmm" (hwo As HWAVEOUT, pwh As *WAVEHDR, cbwh As DWord) As MMRESULTDeclare Function waveOutUnprepareHeader Lib "winmm" (hwo As HWAVEOUT, pwh As *WAVEHDR, cbwh As DWord) As MMRESULTDeclare Function waveOutWrite Lib "winmm" (hwo As HWAVEOUT, pwh As *WAVEHDR, cbwh As DWord) As MMRESULTDeclare Function waveOutPause Lib "winmm" (hwo As HWAVEOUT) As MMRESULTDeclare Function waveOutRestart Lib "winmm" (hwo As HWAVEOUT) As MMRESULTDeclare Function waveOutReset Lib "winmm" (hwo As HWAVEOUT) As MMRESULTDeclare Function waveOutGetPosition Lib "winmm" (hwo As HWAVEOUT, pmmt As *MMTIME, cbmmt As DWord) As MMRESULTDeclare Function MulDiv Lib "kernel32" (nNumber As Long, nNumerator As Long, nDenominator As Long) As LongConst WAVE_MAPPER = (-1)Const CALLBACK_FUNCTION = H00030000lConst WOM_OPEN = H3BBConst WOM_CLOSE = H3BCConst WOM_DONE = H3BDConst WHDR_DONE = H00000001Const WHDR_PREPARED = H00000002Const WHDR_BEGINLOOP = H00000004Const WHDR_ENDLOOP = H00000008Const WHDR_INQUEUE = H00000010Const TIME_MS = H0001Const TIME_SAMPLES = H0002Const TIME_BYTES = H0004Const TIME_SMPTE = H0008Const TIME_MIDI = H0010Const TIME_TICKS = H0020TypeDef MMRESULT = DWordTypedef HWAVEOUT = VoidPtrType WAVEHDR lpData As *Byte dwBufferLength As DWord dwBytesRecorded As DWord dwUser As DWord dwFlags As DWord dwLoops As DWord lpNext As *WAVEHDR reserved As *DWord End TypeType MMTIMEwType As DWordu As DWordu2 As DWordEnd TypeClass WavePlayerPrivatebuffer[2] As *Bytehwo As HWAVEOUTwfe As WAVEFORMATEXhF As HANDLEswitch As LongFunction GetWavHeader() As LongDim head[3] As ByteDim r As DWordReadFile(hF, head, 4, VarPtr(r), ByVal 0)If (memcmp(head, "RIFF", 4)) Then Exit FunctionReadFile(hF, head, 4, VarPtr(r), ByVal 0)'ファイルサイズReadFile(hF, head, 4, VarPtr(r), ByVal 0)If (memcmp(head, "WAVE", 4)) Then Exit FunctionReadFile(hF, head, 4, VarPtr(r), ByVal 0)If (memcmp(head, "fmt ", 4)) Then Exit FunctionReadFile(hF, head, 4, VarPtr(r), ByVal 0)ReadFile(hF, VarPtr(wfe), Sizeof(WAVEFORMATEX), VarPtr(r), ByVal 0)If r SizeOf(WAVEFORMATEX) Then Exit FunctionReadFile(hF, head, 2, VarPtr(r), ByVal 0)'"ta"ReadFile(hF, head, 4, VarPtr(r), ByVal 0)'データサイズGetWavHeader = 1End FunctionSub waveOutProc(hwo As HWAVEOUT, uMsg As DWord, dwInstance As *DWord, dwParam1 As DWord, dwParam2 As DWord)Dim x As *WavePlayerx = dwInstanceSelect Case uMsgCase WOM_CLOSECase WOM_DONEx- wh[1].dwUser = x- wh[1].dwUser - 1If x- wh[0].dwUser = 0 Then x- read(hwo)Case WOM_OPENEnd SelectEnd SubPublicwh[2] As WAVEHDRSub read(hwo As HWAVEOUT)Dim r As DWordIf hwo = NULL Or wh[0].dwUser = 1 Or wh[1].dwUser 1 Then Exit SubwaveOutUnprepareHeader(hwo, VarPtr(wh[switch]), SizeOf(WAVEHDR))ReadFile(hF, buffer[switch], wfe.nAvgBytesPerSec, VarPtr(r), ByVal 0)wh[switch].lpData = buffer[switch]wh[switch].dwBufferLength = rIf r = 0 Then wh[0].dwUser = 1'これ以上再生しませんwaveOutPrepareHeader(hwo, VarPtr(wh[switch]), SizeOf(WAVEHDR))waveOutWrite(hwo, VarPtr(wh[switch]), SizeOf(WAVEHDR))wh[1].dwUser = wh[1].dwUser + 1switch = switch + 1If switch = 2 Then switch = 0End SubFunction play(infile As *Byte) As LongIf hwo NULL Then Exit FunctionhF = CreateFile(infile, GENERIC_READ, 0, ByVal 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0)If hF = INVALID_HANDLE_VALUE Then Exit FunctionIf GetWavHeader() = 0 ThenCloseHandle(hF)Exit FunctionEnd Ifbuffer[0] = malloc(wfe.nAvgBytesPerSec)buffer[1] = malloc(wfe.nAvgBytesPerSec)waveOutOpen( VarPtr(hwo), WAVE_MAPPER, VarPtr(wfe), AddressOf(waveOutProc) ,VarPtr(this), CALLBACK_FUNCTION)read(hwo)Sleep(500)read(hwo)play = 1End FunctionSub stop() As LongIf hwo = NULL Then Exit Subwh[0].dwUser = 1waveOutReset(hwo)While wh[1].dwUser 0Sleep(1)WendwaveOutUnprepareHeader(hwo, VarPtr(wh[0]), SizeOf(WAVEHDR))waveOutUnprepareHeader(hwo, VarPtr(wh[0]), SizeOf(WAVEHDR))free(buffer[0])free(buffer[1])waveOutClose(hwo)CloseHandle(hF)hwo = NULLEnd SubFunction state(t As *DWord) As Longstate = wh[1].dwUserIf t = NULL Then Exit FunctionDim mmt As MMTIMEmmt.wType = TIME_SAMPLESwaveOutGetPosition(hwo, VarPtr(mmt), SizeOf(MMTIME))SetDWord(t,MulDiv(mmt.u , 1000, wfe.nSamplesPerSec))End FunctionEnd Class#define SELFTEST#ifdef SELFTEST#N88BASICDim wp As WavePlayerDim time As DWordPrint "再生"wp.play("test.wav")While wp.state(VarPtr(time))Locate 4,1Print time\1000;"sec"Sleep(1000)Wendwp.stop()Print "停止"#endif
https://w.atwiki.jp/utauuuta/pages/3648.html
ぶらっくぼっくす【登録タグ napi ふ 曲 重音テト】 作詞:napi 作曲:napi 編曲:napi 唄:重音テト 曲紹介 napi氏の投稿33曲目。 歌詞 馬鹿げた近似化 無意味な統計 ふざけたカテゴライズ ただ繰り返し 入力 / 出力 間にあるのは シナプス燃やしている黒い箱 知った振りして 気持ち押し付け 傷付けては忘れて そのサイクルの中 答えがあると信じ 箱に隠した誰にも解けはしないパズル パンドラの災いはどこにもない 不要な演算 無価値な構造 足りないリソースなど 全部いらない 入力 / 出力 渡した引数 全てがそれだけだと 言うのなら 近づいたよう思えたあとに また分からなくなるよ この振り子のような 振る舞いが見せた夢 量子が示す可能性とその限界 何ビット重ねても無駄だと知る 演繹的な推論などが 存在しないのなら また過ち犯し 繰り返すしかないさ ブラックボックス 決して知れぬその答えを 知りたくて 求めては また傷つく コメント 名前 コメント
https://w.atwiki.jp/abwiki/pages/63.html
MCIによる、お手軽サウンドプレイヤー 公式サイトで毎日のようにABのバグフィックスが行われていた頃…公式にMCIを使った解説があった。 AB4.24のサンプルにCDPlayerがあるが、これもMCIを使ったもの。 MCIでmpegやavi、waveやmidiなどを簡単に再生することができるので、エロゲー制作にはもってこいだ。 ただしMCIには問題があって、再生終了などのメッセージを受け取るにはウインドウハンドルが必要なことだ。 つまり、コンソールアプリ、N88アプリでは、扱えないということになってしまうような気がする。 その回避方法は、ダミーウインドウを作り、そいつにメッセージを送らせるようにする。 ダミーと言ってもウインドウ。見えないだけ。 そこで登場するのがサブクラス化だ。 ウインドウプロシージャを横取りするものである。 #N88BASIC #include api_mmsys.sbp Function callback(hwnd As HWND, msg As DWord, wp As WPARAM, lp As LPARAM) As Long Dim dwCallback As DWord If msg=MM_MCINOTIFY And wp=MCI_NOTIFY_SUCCESSFUL Then デバイスを閉じる mciSendCommand(mop.wDeviceID,MCI_STOP,MCI_WAIT,dwCallback) mciSendCommand(mop.wDeviceID,MCI_CLOSE,MCI_WAIT,dwCallback) mop.wDeviceID=0 Exit Function End If callback = CallWindowProc(DefProc , hwnd , msg , wp , lp) End Function Function mciplay() As Long If mop.wDeviceID 0 Then Exit Function Dim ofn As OPENFILENAME Dim mpp As MCI_PLAY_PARMS Dim bErr As Long Dim buffer[MAX_PATH-1] As Byte ファイル名を取得 ofn.lStructSize=SizeOf(OPENFILENAME) ofn.hwndOwner=_PromptSys_hWnd ofn.lpstrFilter=Ex"音楽 ファイル(*.wav;*.mid;*.mp3;*.wma)\0*.wav;*.mid;*.mp3;*.wma;\0動画 ファイル(*.avi;*.mpg;*.wmv;)\0*.avi;*.mpg;*.wmv;\0すべてのファイル(*.*)\0*\0\0" ofn.nFilterIndex=1 ofn.nMaxFile=MAX_PATH ofn.lpstrFile=buffer If GetOpenFileName(ofn) = FALSE Then MessageBox(_PromptSys_hWnd,"ファイルのオープンに失敗","error",MB_OK) Exit Function End If mop.lpstrElementName=buffer If mciSendCommand(0,MCI_OPEN,MCI_OPEN_ELEMENT or MCI_WAIT,mop) Then MessageBox(_PromptSys_hWnd,"デバイスのオープンに失敗","error",MB_OK) Exit Function End If mpp.dwCallback=_PromptSys_hWnd If mciSendCommand(mop.wDeviceID,MCI_PLAY,MCI_NOTIFY,mpp) Then MessageBox(_PromptSys_hWnd,"デバイスの再生に失敗","error",MB_OK) Exit Function End If Print "再生 ";MakeStr(buffer) mciplay = GetTickCount() End Function Function GetTime() As Long If mop.wDeviceID = 0 Then Exit Function Dim msp As MCI_STATUS_PARMS msp.dwItem=MCI_STATUS_POSITION mciSendCommand(mop.wDeviceID,MCI_STATUS,MCI_WAIT or MCI_STATUS_ITEM,msp) GetTime=msp.dwReturn End Function ここからメイン処理 Dim mop As MCI_OPEN_PARMS サブクラス Dim DefProc As Long DefProc = GetWindowLong(_PromptSys_hWnd, GWL_WNDPROC) SetWindowLong(_PromptSys_hWnd , GWL_WNDPROC , AddressOf(callback)) *INFINITY If mciplay() = 0 Then End While(mop.wDeviceID) Locate 0,2 Print "時間 ";GetTime() Sleep(500) Wend MessageBox(_PromptSys_hWnd,"再生終了しました。","N88MCI",MB_OK) Cls 3 Goto *INFINITY
https://w.atwiki.jp/hamilton/pages/531.html
このWikiのこと。 右橋さんが公開されていた旧LivebayWikiのデータを勝手に引き継ぐ形(管理人 すいませんm(_ _)m)で公開開始。
https://w.atwiki.jp/abwiki/pages/58.html
UTF82SJIS http //blog.goo.ne.jp/xmldtp/e/7eaeeb3dabfe975dbc57f73aefb1c059からコピペ #N88BASIC Function utf8ToSjis(utf8 As *Byte) As *Byte Dim utf16 As *Word Dim wlen As Long Dim sjis As *Byte utf8ToSjis = NULL If utf8 = NULL Then Exit Function End If ============================== UTF8=>UTF16変換 ============================== まずは、wlenの長さをとる wlen = MultiByteToWideChar(CP_UTF8, 0, utf8, -1, NULL, 0) If wlen = 0 Then Exit Function End If utf16の領域確保 utf16 = calloc(wlen + 1) If utf16 = NULL Then Exit Function End If utf16変換 If MultiByteToWideChar(CP_UTF8, 0, utf8, -1, utf16, wlen) = 0 Then free(utf16) Exit Function End If ============================== UTF16=>ShiftJIS変換 ============================== まずは、長さを取得 Dim mlen As Long mlen = WideCharToMultiByte(CP_ACP,0,utf16,-1,NULL,0," ",NULL) If mlen = 0 Then free(utf16) Exit Function End If 領域確保 sjis = calloc(mlen + 1) If sjis = NULL Then free(utf16) Exit Function End If utf16変換 If WideCharToMultiByte(CP_ACP,0,utf16,-1,sjis,mlen," ",NULL) = 0 Then free(utf16) free(sjis) Exit Function End If free(utf16) utf8ToSjis = sjis End Function Dim utf8[1000] As Byte Dim sjis As *Byte Dim hF As HANDLE Dim r As DWord hF = CreateFile("utf8.txt", GENERIC_READ,0,ByVal 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,0) ReadFile(hF, utf8,1000, Varptr(r),ByVal 0) sjis = utf8ToSjis(utf8) Print MakeStr(sjis) CloseHandle(hF) free(sjis) Input sjis WinAPIを使うべき処理 ShiftJIS→Unicode(UCS-2)変換 MultiByteToWideChar関数を使う。 MultiByteToWideChar(外部ページ) に詳しい。誰かコピーして。 Unicode(UCS-2)→ShiftJIS変換 WideCharToMultiByte関数を使う。 WideCharToMultiByte(外部ページ) に詳しい。誰かコピーして。 WinAPIを使わなくてもプログラム側で簡単に変換できるもの ShiftJIS→EUC-JP変換 ShiftJISとEUC-JPはエンコードが違うだけで同じ符号体系を用いている。その為、この変換は比較的容易い。 Sub SJIS2EUCJP(src As *Byte,dst As *Byte) Dim is=0 As Long,id=0 As Long Do If src[is]=0 then dst[id]=0 Exit Do Else If src[is] H80 then dst[id]=src[is] is++ id++ Else If ( HA1 =src[is]) And (src[is] = HDF) then dst[id]= H8E dst[id+1]=src[is] is++ id+=2 Else Dim a As Long,b As Long b=src[is+1]- H3F If b=0 then dst[id]=0 Exit Do End If If b 63 then b-- a=src[is]*2- H101 If a 62 then a-=128 If b 94 then b-=94 a++ End If If (a 1) Or (94 a) Or (b 1) Or (94 b) then dst[id]=0 Exit Do End If dst[id]=a+ HA0 dst[id+1]=b+ HA0 is+=2 id+=2 End If Loop End Sub EUC-JP→ShiftJIS変換 Sub EUCJP2SJIS(src As *Byte,dst As *Byte) Dim is=0 As Long,id=0 As Long Do If src[is]=0 then dst[id]=0 Exit Do Else If src[is] H80 then dst[id]=src[is] is++ id++ Else If src[is]= H8E then dst[id]=src[is+1] is+=2 id++ Else If src[is]= H8F then JIS X 0212-1990文字集合だが、Shift-JISには無いため?で代用する。 dst[id]=Asc("?") is+=3 id++ Else Dim a As Long,b As Long a=src[is]- HA0 b=src[is+1]- HA0 If (a 1) Or (94 a) Or (b 1) Or (94 b) then dst[id]=0 Exit Do End If a-- If a and 1 then a-- b+=94 End If a=(a 1)+ H81 If b 63 then b++ If a H9F then a+=64 dst[id]=a dst[id+1]=b+ H3F is+=2 id+=2 End If Loop End Sub Unicode(UCS-2)→Unicode(UTF-8)変換 UCS-2とUTF-8はエンコードが違うだけで同じ符号体系を用いている。その為、この変換は比較的容易い。 Sub UCS22UTF8(src As *Byte,dst As *Byte) Dim is=2 As Long,id=0 As Long Dim fBE As Long If (src[0]= HFF) and (src[1]= HFE) then BOM fBE=0 Else If (src[0]= HFE) and (src[1]= HFF) then fBE=1 Else default=Big Endian(RFC 2781) fBE=1 is-=2 End If Do If src[is]=0 And src[is+1]=0 then dst[id]=0 Exit Do Else Dim c As Long c=src[is+(1-fBE)] As Long*256+src[is+fBE] If c H80 then dst[id]=c id++ Else If c H800 then dst[id]= HC0 Or (c 6) dst[id+1]= H80 Or (c and H3F) id+=2 Else If c H10000 then dst[id]= HE0 Or (c 12) dst[id+1]= H80 Or ((c 6) and H3F) dst[id+2]= H80 Or (c and H3F) id+=3 Else dst[id]=0 Exit Do End If is+=2 End If Loop End Sub Unicode(UTF-8)→Unicode(UCS-2) Sub UTF82UCS2(src As *Byte,dst As *Byte) Dim is=0 As Long,id=2 As Long If (src[0]= HEF) And (src[1]= HBB) And (src[2]= HBF) then is+=3 dst[0]= HFE dst[1]= HFF Do If src[is]=0 then dst[id]=0 Exit Do Else Dim c As Long If src[is] H80 then c=src[is] is++ Else If src[is] HE0 then If src[is+1]=0 then dst[id]=0 Exit Do Else c=((src[is] And H1F) 6) Or (src[is+1] And H3F) is+=2 End If Else If src[is] HF0 then If src[is+1]=0 then dst[id]=0 Exit Do Else If src[is+2]=0 then dst[id]=0 Exit Do Else c=((src[is] And H0F) 12) Or ((src[is+1] And H3F) 6) Or (src[is+2] And H3F) is+=3 End If Else If src[is] HF8 then If src[is+1]=0 then dst[id]=0 Exit Do Else If src[is+2]=0 then dst[id]=0 Exit Do Else If src[is+3]=0 then dst[id]=0 Exit Do Else c=((src[is] And H03) 18) Or ((src[is+1] And H3F) 12) Or ((src[is+2] And H3F) 6) Or (src[is+3] And H3F) is+=4 End If Else dst[id]=0 Exit Do End If If c H10000 then UCS2には拡張領域が無いため表現できない。 dst[id]=0 dst[id+1]=Asc("?") id+=2 Else dst[id]=c 8 dst[id+1]=c And HFF id+=2 End If End If Loop End Sub nkf32を使って nkf32は文字コードの各種変換を行う便利ライブラリ。 DLLとして提供されていて、使い易くなってる。 ABも実はこれを使っている。SubOperationフォルダーを参照。 使い方は結構簡単で、例えば次のようにするだけで、何らかの文字コードのファイルをEUCに変換してくれる。 #N88BASIC'宣言Declare Sub GetNkfVersion Lib "Nkf32.dll" (verStr As *Byte)Declare Function SetNkfOption Lib "Nkf32.dll" (optStr As *Byte) As LongDeclare Sub NkfConvert Lib "Nkf32.dll" (outStr As *Byte, inStr As *Byte)Declare Sub ToHankaku Lib "Nkf32.dll" (inStr As *Byte)Declare Sub ToZenkakuKana Lib "Nkf32.dll" (outStr As *Byte, inStr As *Byte)Declare Sub ToMime Lib "Nkf32.dll" Alias "EncodeSubject" (outStr As *Byte, inStr As *Byte)Declare Sub EncodeSubject Lib "Nkf32.dll" (outStr As *Byte, inStr As *Byte)Dim vstr[478] As ByteDim in As *ByteDim out As *ByteDim size As DWordGetNkfVersion(vstr)Print "nkf32のバージョン→" MakeStr(vstr)in = LoadFile(VarPtr(size))If in And size Then Print "読み取りOK" Else EndIf SetNkfOption("-e") = 0 Then Print "EUCに変換します"out = calloc(size+1)NkfConvert(out, in)SaveFile(out, lstrlen(out))Print "おわり"End'ファイルを開いて中身を返すFunction LoadFile(sss As *Long) As *ByteDim ofn As OPENFILENAMEDim buffer[333] As Byteofn.lStructSize=SizeOf(OPENFILENAME)ofn.hwndOwner=GetActiveWindow()ofn.lpstrFilter=Ex"テキスト ファイル(*.txt)\0*.txt\0すべてのファイル(*.*)\0*\0"ofn.nFilterIndex=1ofn.lpstrFile=bufferofn.nMaxFile=333ofn.lpstrTitle="ファイルを開く"ofn.Flags=OFN_FILEMUSTEXIST or OFN_PATHMUSTEXISTIf GetOpenFileName(ofn)=0 Then Exit Function'OpenDim hF As HANDLEDim r As DwordDim x As *BytehF = CreateFile( buffer, GENERIC_READ, 0, ByVal 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0)SetDWord(sss, GetFileSize(hF, 0))x = calloc(GetDword(sss)+1)ReadFile(hF, x, GetDword(sss), sss, ByVal 0)CloseHandle(hF)LoadFile = xEnd Function'oooの内容を保存Function SaveFile(ooo As *Byte, sss As Long) As LongDim ofn As OPENFILENAMEDim buffer[333] As Byteofn.lStructSize=SizeOf(OPENFILENAME)ofn.hwndOwner=GetActiveWindow()ofn.lpstrFilter=Ex"テキスト ファイル(*.txt)\0*.txt\0すべてのファイル(*.*)\0*\0"ofn.nFilterIndex=1ofn.lpstrFile=bufferofn.nMaxFile=333ofn.lpstrTitle="ファイルを保存"ofn.Flags=OFN_FILEMUSTEXIST or OFN_PATHMUSTEXISTIf GetSaveFileName(ofn)=0 Then Exit Function'OpenDim hF As HANDLEDim w As DwordhF = CreateFile(buffer, GENERIC_WRITE, 0, ByVal 0, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, 0)WriteFile(hF, ooo, sss, VarPtr(w), ByVal 0)CloseHandle(hF)SaveFile = 44End Function
https://w.atwiki.jp/tpc-document/pages/277.html
第18章「The Catfish(『鯰』と呼ばれた兵器)」 【大統領閣下の生命反応が途絶えました。最終コードの発動を確認。全精神兵器を無制限に解放。終末作戦を開始します。直ちに大樹大陸より脱出してください――】 機械音声が冷たくその事実を告げる。 地響きとともにどこかから咆哮のような唸り声が聞こえる。おそらく目覚めたのだろう、機械都市マキナの半分を一瞬にして消滅させてしまったあの兵器『鯰』が。 「そんな……ついに大統領を倒して戦争は終わったと思ったのに。これですべて終わったんじゃなかったのか!」 ゲンダーは絶望の中にいた。大統領の作りだした精神世界からは脱したが、その代わりにこんどは絶望の渦の中に捕らえられてしまっていた。 「ヘイヴが還ってくるその日まで、メイヴを護り続けることがオレの願いだった。それなのに、それなのに! メイヴはオレのせいで……! 戦争も止められなかった。なんなんダよ。なんなんダ、オレは……ッ!!」 「ゲンダー、落ち着くんだ!」 ガイストは我を忘れて取り乱すゲンダーに言い聞かせた。 「まだすべてが終わったわけじゃない。あの兵器を止めるチャンスはきっとある! メイヴだってまだ復活の可能性がなくなったわけじゃないし、僕も最大限の努力をする! だからゲンダー。諦めるには早すぎる! それにメイヴが言ってただろう。たとえ万にひとつでも、億にひとつだろうと、可能性があるなら勝算はある。0%でなければ、たとえどんなに可能性が低くても信じる価値があると」 「でも……そのメイヴは今こんな状態ダ。大統領との戦いダって、ガイストクッペルからの脱出ダって、思えばヘイヴの研究所からシャトルで飛び出すときから、オレはずっとメイヴに助けられてきてばかりダった。そんなオレが一人であの『鯰』になんて勝てるわけがないんダ。やっぱりオレは駄作ダったんダ……」 ゲンダーは明らかに参っている様子だった。メイヴのことはもちろんだが、大統領との戦いで限界を超えて力を振り絞ったことも影響しているのだろう。いつものゲンダーらしくない弱気な言葉が次々と零れた。 「ゲンダー、君だけが頼りなんだ。僕はメイヴを復旧させるために手が離せない。君がやらなくてだれがやるんだ!」 「無理ダ。なんせ大陸の形を変えてしまうようなやつダぞ。仮にオレとメイヴの二人がそろっていたとしても勝てるかどうか。戦車でも引っ張ってこなければ相手にもならない……いや、戦車があったって歯が立つかどうか…」 「できるかどうかじゃなくて、『やる』んだろ! 戦争を止めると言い出したのは他でもない君じゃないか!」 「ああそうダ。でもそれはメイヴを護るために障害になると思ったからダ。メイヴがこんなになっちまったんじゃ、オレにはもう戦う理由も意味もない…」 そう言うなり、ゲンダーは顔を背けて座り込んでしまった。 (これは相当参ってるな。やはりゲンダーは人間同様の感情をもっている。あるいはそれ以上に繊細な……いや、今はそんなことを考えている場合じゃないな) ガイストはマキナを発つときにスヴェン博士に言われたことを思い出していた。 (そうだ、今のゲンダーはあのときの自分と同じだ。メイヴは完全に壊れてしまったわけではないが、自分にとって大切なものを失い、しかもその原因は自分にあり、自分の無力さは痛いほど思い知らされて、そしてそれが悔しくて許せなくてどうしようもなくて……追い詰められているんだ、自責の念に。思い出せ、先生はあのときどうした?) それを思い出せば、思い当たるやるべきことはひとつしかなかった。 「ゲンダー、いいのか。君はそれで満足か。メイヴを護りたいんだろう。メイヴを信じるんじゃなかったのか!?」 「でも、メイヴはもう…」 「いい加減にするんだ!!」 「!?」 気がつくとつい熱くなってゲンダーを一発殴っていた。かつてスヴェンが自分にそうしたように。 ゲンダーの気持ちは痛いほどよくわかる。しかし、今ならスヴェンの気持ちもよくわかる。ゲンダーを殴った際に針が刺さって拳からは血が出たが、これはあのときのスヴェンと同じ痛み。今の自分にできることはこうしてゲンダーの痛みを分かち合ってやることぐらいだ。 (しかし僕は知っている。それが自分を追い込んでしまった者にとってどれだけの助けになるのかを) ゲンダーは殴り倒されたそのままの姿で横たわっていた。 「メイヴがどうしてあんな無茶をしてまで君を助けようとしたか考えたことはあるか?」 返答はなかったが、ガイストはそのまま続けた。 「それは君がメイヴを信じたのと同じように、メイヴも君を信じていたからだ。君が大統領との戦いでピンチに陥ったとき、メイヴはとても焦っていたよ。機械のくせにね。科学者の僕が言うのもおかしな話だけど、もしかしたらメイヴも君と共に過ごすうちに感情のようなものが芽生えたのかもしれない。君がメイヴを護ろうとしていたように、メイヴも君を護りたかったんだ。だから、自身の危険を顧みずにあんな賭けに出た。ドームからレールを使って脱出するときだってきっとそうだったに違いない。そうまでして君を護ってくれたんだ。その君がメイヴに応えなくてどうするんだ!」 「メイヴ…」 そして、少し間をおいてガイストは言った。 「いいのか? メイヴの想いを無駄にしても」 やはりゲンダーは何も答えなかったが、こちらに背を向けたままゆっくりと立ち上がった。それは答えとしては十分だった。 「僕の知っているゲンダーはそんなに弱いやつじゃない! そうだろう」 「グメっ、グメメェーっ!」 グメーもグメーなりにゲンダーを元気付けているようだ。 しっかりと立ち上がるとゲンダーは、 「……すまん」 と静かに一言だけ呟いて駆け出して行った。 遠ざかっていくゲンダーの後ろ姿は、もはや自身を追い込んでしまった者の背中ではなかった。 「グメー。君もゲンダーについてサポートしてやってくれ。僕は僕のできることをやろう」 「グッッメェィァ!!」 グメーは力強く敬礼をしてみせると、脇目も振らずにゲンダーの後を追って行った。 「よし……待ってろよ、メイヴ。必ず助けてやるからな」 ガイストはゲンダーたちを見送ると、なんとかメイヴを復旧させられないか試行錯誤し始めた。 (しかしこれで二度目か。機械を叩いて直すなど科学者としてあるまじき……) 痛む拳を眺めると苦笑が漏れた。 ゲンダーとグメーは中枢タワーを飛び出すと、真っ直ぐに唸り声の聞こえたほうへと向かった。 街を抜け、林を越え、マキナとの国境付近へとたどり着くと、『鯰』が近いのだろう、巨大なものが跳ね回るような連続した地響きが足を伝わってくる。 「やはりマキナを狙って進んでるようダ。大統領め、始めっから仕組んでやがったな」 「グメぇ?」 「自分の身に何かあったときは自動的に精神兵器がマキナを襲うように用意していたに違いない。きっとマキナが手に入らないぐらいなら、いっそぶち壊してしまうつもりダったんダ。どこまでも自分勝手な奴め」 さらに先へ進み、唸り声と地響きを頼りにたどり着いたのは、ガイストクッペルから脱出するときに使ったレールを降りたあたりだった。そこにはあのときのレールがそのままの状態であった。 (あの時も、メイヴは無茶をしてオレたちを助けてくれた。こんどはオレたちがメイヴを助ける番ダ!) 「グメっ!? グメメメメェェェーーーーっ!!」 突然グメーシスが慌てた声を上げる。 「……ようやく追いついたか、『鯰』!」 地響きはどんどん大きくなる。ひと際大きく揺れたかと思うと、それは地平線の向こうからおもむろに姿を見せた。 山のように大きな『鯰』の姿を模した兵器。それはあまりにも強大で、放置されていたレールの車体をいとも容易く踏みつぶしてスクラップにしてしまった。 『グォォオオォッ』 金属の擦れ合う音なのだろうか、まるで恐竜のような唸り声を『鯰』は響かせている。 「こいつ、なんて迫力……! ダけど、オレは『やる』んダ! これはオレ自身との戦いでもある。いや、オレだけじゃない。メイヴの、ガイストの、グメーの……そう、オレたちの戦いダ。地震なんかに負けるもんか!」 『グォォオオォオォォオオォォォン!!』 答えるかのように『鯰』は鋼の咆哮を上げる。 「上等ダ。不利ダなんて思わないぞ。機械VS機械、条件は対等ダからな!」 「グメェェーっ!!」 負けるもんか、とグメーも咆え声を上げる。 ついに今、最後の決戦が始まった。 一方その頃、メイヴは見慣れない空間を彷徨っていた。 『ここは一体……私はまだ大統領の精神世界にいるのでしょうか。ゲンダー? どこですか、ゲンダー』 様子を探るべく周囲をサーチしようと試みるが身体は言うことをきかない。それどころか、身体の感覚すら感じられない。はて、感覚…? 感覚とは一体何か。 メイヴは知識として感覚を知っている。データベースには大抵のことが記されている。しかし、実際にその感覚がどういうものかは知らない。当然だ、彼は機械なのだから。にもかかわらず、今の自身の状況を説明するのに「感覚がない」という表現が自然と現れた。今や、メイヴは意識だけがそこに漂っている状態だった。 『私は「感覚」を知っている……いや、これはブラックボックスの……記憶?』 するとブラックボックスから流れ込んでくる記憶が目前に映像となって再生され始めた。 『これは……ふむ。見覚えがあります。ヘイヴですね。隣の機械にも見覚えがあります。これは私……いや、私が生まれる前の私ですね。ヘイヴがブラックボックスを研究していた頃でしょうか。ゲンダーの姿はまだないようですね』 しばらくすると映像がぼやけて別の場面に切り替わった。 黒い石をブラックボックスに加工するヘイヴ。 黒石の危険性についてヘイヴと論争する若き日のスヴェン。 ヴェルスタンド西部の炭鉱から発掘される黒石。 これはメイヴが誕生するよりもさらに前の出来事だ。どうやら時間を遡りつつ、ブラックボックスの記憶が呼び起こされているらしい。巻き戻しの映像を早回しで見ているような光景が眼前に広がっている。 炭鉱に降り注ぐ流星。大気圏で発火し複数に割れる黒い雫。星の海を飛来する隕石。隕石は黄昏の惑星を通り過ぎ、猛毒の大気の中を抜け、炎と砂と水の嵐を越え、時には巨大な宇宙生命体の体内を通り抜け、小惑星群と爆発性のガスを潜り抜け、常闇の惑星の上空を通過し、しばらく宇宙空間を彷徨った後に、漆黒の惑星から飛び出す。 再現される映像はめまぐるしく切り替わり次第に再生速度を速めていく。やがてメイヴはそれらの情報を整理しきれなくなっていった。 『ま、待ってください。これ以上は……やめろ、やめてくれ! 入ってくるな!! も……もう、たく、さ…ん………だ……。ああ、ゲンダー……』 メイヴの意識はそこで途絶えた。 「えっ?」 思わずゲンダーは振り返った。 その隙を見逃さず『鯰』の強力な一撃が入る。痛恨の一撃、ゲンダーは弾き飛ばされて地面に激突した。 「うぐ……っ、油断した…」 「グメぇ!?」 グメーが心配そうにゲンダーの顔を覗き込んでいる。 「大丈夫ダ。たダなぜか急にメイヴに呼ばれたような気がしたんダ…」 さすがに気のせいだろうと考えたが、どうにも胸騒ぎがしてならない。 しかし、敵はそんなことはお構いなしと言わんばかりに攻撃を続けてくる。『鯰』は容赦なく鰭を模したアームを振り降ろす。ドスンと重い一撃は大地を揺らし、地面に深い穴を空ける。ゲンダーたちはこれをギリギリのところでかわしたが、体勢を整える間も与えずに『鯰』は飛び上がり、その山のように大きな巨体でゲンダーを押し潰しにかかる。 「や、やばい! 汁一本!!」 冷静になれ、落ち着けと自分に言い聞かせて集中、右腕に力を溜める。 凝縮された一撃が放たれる。一瞬遅れて大爆発が起こり、爆風によってゲンダー吹き飛ばされ、その勢いを利用して『鯰』の攻撃から逃れた。続けて『鯰』さっきまでゲンダーのいた場所を踏みしめる。局所的な揺れがゲンダーを襲う。少しでも遅ければ今頃は奴の下敷きになっていただろう。一方で『鯰』は汁一本をほとんど零距離で食らったにもかかわらず、傷一つついていなかった。 「まるで歯が立たない……汁一本すら通用しない。何か……何かないのか!? 汁一本を上回る攻撃方法は…」 『鯰』が跳ねる。落ちる。揺れる。そのたびに足をとられて立っているのも難しく、集中して考えている余裕などとてもなかった。 グメーも精一杯たいあたりをぶつけるが、特殊な素材でできているのか『鯰』はグメーに触れても粉のようになって消滅してしまうようなこともなかった。 決定的な一撃どころか、かすり傷すら与えられないまま戦いは続く。 「これはまずい…!」 一方でガイストも苦戦していた。大統領執務室にあったPCを拝借してメイヴのシステムに侵入し、なんとかブラックボックスの暴走を止められないかと奮闘していたが、メイヴのプログラムは目にも止まらない速さでブラックボックスに上書きされていく。そのせいなのか、パフォーマンスが目に見えて低下し、自己修復機能によるのバックアップの復旧速度が徐々に落ち始めている。上書き速度が復旧速度をうわまろうとしている。このままではあと数分ともたないかもしれない。 それだけでなくブラックボックスの侵蝕が激しく、ついにはメイヴへのアクセスが弾かれるようになってしまった。こうなってはもうお手上げとしか言いようがない。 「僕の力では及ばないのか!? こんなときに師匠が……ヘイヴいてくれたら。くそっ、仕方ない。そういう約束だったからな……すまない、メイヴ」 ――それは溯ること数十分前―― 『ガイスト博士、お願いがあります』 ゲンダーが精神世界で戦っている最中、メイヴが何かを決意した様子で話し始めた。 「どうした、改まって。何かゲンダーを助けるいい作戦でも思いついたのか?」 『ええ。どうやら私はゲンダーのいる空間に直接干渉することはできないようですが、幸いにもゲンダーの本体はここにいるので、このゲンダーに干渉することで間接的に空間内に影響を与えることができます。つまりゲンダーがこちらとあちらの空間をつなぐ唯一の架け橋というわけです。私がゲンダーのシステムに侵入してリミッターを解除すれば、ゲンダーを劇的にパワーアップさせることもできるでしょう』 「そんなことができるのか! それなら大統領にも勝ち目があるかもしれない」 『ええ、おそらく勝てるでしょう。しかし、ゲンダーの意識は精神世界のほうに行っています。たとえリミッターを解除しても、誰かがそれをゲンダーに知らせてあげなければ意味がありません』 「それは困ったな。精神世界に入れるのは精神体だけ。あらゆる生き物には精神体が存在するが、それでも自由に入れるわけじゃない。少なくとも、大統領自身が呼び込まない限りはな。存在そのものが精神体のようなグメーなら侵入は容易いだろうけど……」 「グメーメ?」 「言葉を話せないから、伝えるのは厳しいか」 『いいえ、方法はあります。そこでお願いなのですが…』 ブラックボックスの力を解放すればメイヴの性能をブーストさせて精神世界のゲンダーに干渉することが可能になる。ただしブラックボックスの強力すぎるエネルギーを制御し切れずに暴走してしまう恐れもあるという。 まさに両刃の剣。危険な賭けになる。しかし、それが唯一の方法だった。 『いいですか、よく聞いてください。私はブラックボックスの力で私のプログラムを一時的に書き換えます。ゲンダーと連絡を取るためには必要なことです』 「そんなことをして君は大丈夫なのか」 『あとでプログラムを元通りに書き戻せば問題はないはずです。しかし当然ながらシステム上、想定されていないことを行うわけですから、どんな不具合が起こるかは予想もつきません。もしかするとシステムがクラッシュしてすべての記録が飛んでしまう可能性だってあります』 「すべての記録が……それは、君にとっての死を意味するのではないのか!?」 『さぁてね。まだ死んだことがないので、私にはわかりません。しかし記録が飛んでもバックアップがありますし、なんとかなると信じたいですね。まあバックアップから呼び戻された私が「今の私と同一の私」であるかどうかは判断しかねますが。ただ心配なのはプログラムを書き換えた上での正常なリカバリーができるのかという点、そしてブラックボックスには未解明の部分が多いので何が起こるかわからないという点です。もちろんこの作戦を成功させるためにはそれを私が制御する必要があるのですが……いえ、大丈夫です。なにより、ゲンダーを救うためにこれは必要なことなのです。これしかないんです! もう決めました。私はやりますよ。やってみせます! もちろん……協力してくれますよね?』 「正気なのか!?」 そして作戦は決行され、ゲンダーは見事に大統領を打ち倒すことになる。しかし、この話にはまだ続きがあった。 『ガイスト。これはできれば起こってほしくないことなのですが……』 メイヴはおもむろに話し始めた。 『もちろん私はこの作戦を成功させるつもりです。いや、成功させなければならない。ですが、もし失敗した場合……そして、もし私の記録がすべて失われてしまった場合、そのときは私はもう残念ながらゲンダーの役には立てないでしょう。もしそうなったときは、私を分解してブラックボックスを取り出してください』 「分解!? 一体何を言い出すんだ」 『ブラックボックスははっきり言って謎だらけです。私のデータベースをもってしてもほとんど何もわかりません。しかし、これがとても大きな力を秘めていることだけはわかります。ですからガイスト、もしそのときは私を分解して、ブラックボックスを使って何かゲンダーの助けになるものを作ってあげてください。ブラックボックスの力はきっと役に立ちます。部品が足りなければ私の部品を使うといいでしょう』 「ま、待ってくれ! メイヴ、なんてことを言い出すんだ! それでは君が……君は、どうしてそこまで!?」 『壊れた機械は何の役にも立てません。役に立たない機械など意味がない…。私はゲンダーの役に立ちたい。それだけですよ』 「だ、だが……僕は君を大切な仲間だと思っている。長くはないが共に過ごしてきた仲だ。科学者の僕が言うのも変だが、僕は君やゲンダーを友達だと思ってる! 今ならヘイヴがゲンダーをなぜ発明したのかもわかるような気がするよ。そんな僕に友達を解体させるつもりなのか!? だめだ、そんなことはできない。いくらなんでも、そこまでする必要はない!」 『ガイスト…。辛いかもしれませんが、どうかわかってください。なに、気にすることなんてありませんよ。私は機械であなたは技術者。技術者が機械を分解するのはいつもの仕事のうちでしょう?』 「メイヴ、それが君の望みなのか。それが君にとって満足に値することなのか」 『ゲンダーは感情をもった機械という非常に稀な存在、その価値は計り知れません。決して失うわけにはいかない……私はそう判断しました。そのために役立つなら、この身がどうなろうと本望です』 「これが……君の望みなんだな、メイヴ?」 メイヴはもう何も答えない。PC画面にはメイヴのプログラムの99.9%がブラックボックスに侵蝕されてしまったことが示されている。 「本当にすまない。僕にもっと力があればこんなことにはならなかった…」 (気にしないでください。これは仕方ないことでした。あなたは悪くありません) そう聞こえたような気がした。もちろんメイヴはしゃべれないし、遠隔モニタは消えてしまって久しい。 「ふっ、都合のいい妄想か…。落ち込んでいてもメイヴはもう還ってこない。それならせめてメイヴの最期の望みを叶えてやらなければならない」 ガイストはメイヴの解体に取り掛かった。一度、スヴェンの地下研究所でメイヴの修理を行っているので、解体するのはそう難しいことではなかった。 部品を外して胴体前面を開く。液晶モニタを持ち上げて、その下から取り出したのは黒い球体だ。大きさのわりには両手にずしりと重い。 「これがブラックボックス……本当に真っ黒だな」 こんなボーリング球程度の大きさの球体がすごい力を秘めているという。球体はその漆黒の中に妖しい輝きをみせている。そして神秘的だった。もしかしてこれはメイヴの心臓のようなものなのではないか。そう思うと、球体が脈打っているような錯覚すらしてくる。 「しかし、すごい力があると言われてもこれをどう使えばいいのか…」 ブラックボックスには大きな力が秘められている。ガイストが知ってるのはそれだけだ。 「何か情報はないのか?」 ガイストはメイヴのデータベースへのアクセスを試みた。ブラックボックスを取り外したことで暴走状態が止まったためか、今度は問題なくアクセスすることができた。どうやらデータベース内の情報に関してはそのままの状態を保持しているようだ。 データベースにはこの世のありとあらゆる情報が保存されており、いわば巨大な百科事典のようなものだ。システム的なものや重要な情報はブラックボックスの内部に記録されているようで、とくに参考になりそうなものは見つけられなかったが、以前にガイストクッペルで暴走したときに流入したブラックボックスからの情報の一部がデータベース内に残されていた。 「これは……ヘイヴの研究記録? ブラックボックス……黒石…………スヴェン!? なぜ先生の名前がここに? 先生も黒石の研究に関わっていたのか、知らなかった。だがそうとわかれば、こうしてはいられない!」 ブラックボックスだけを取り除いた状態でメイヴを元通りに閉じると、ガイストはブラックボックスを手にタワーを飛び出した。 先生なら何か知っているかもしれない。そう考えてマキナのスヴェンの元へと急いだ。 『鯰』が飛び上がる。落ちる。衝撃が大地を揺るがす。 そしてまた跳ねる。落ちる。振動。 ゲンダーは『鯰』の攻撃をかわすだけで精一杯だった。 「逃げてばかりじゃ勝てないのはわかってる。でもこれじゃ勝ち目なんかないぞ。せめて、相手に隙を与えることさえできれば…」 グメーシスも一生懸命、『鯰』に攻撃を仕掛けるが残念ながら全く戦力にはなっていなかった。 「汁一本も効かないとなると、もっと威力のある攻撃を仕掛けないとダメか。しかし、あれ以上の力を溜めようとすればオレのほうが限界を超えて自爆してしまう。汁一本は連射も利かないし、一発撃ってから二発目をチャージするのに時間がかかって……待てよ、二発? そうダ!」 何かを閃いたゲンダーはグメーシスに提案する。 「グメー、少しでいい。あいつの注意をオレからそらしてくれないか」 「グメっ!」 任せろ、と言わんばかりに胸を叩いてみせると、グメーは深く息を吸い込み、大声で咆えた。 「グメェェェーーーーーーっ!!」 『鯰』の攻撃の狙いがグメーに移る。ゲンダーはそのわずかな隙を見逃さない。 (両腕から放つ二発の汁一本…その力をひとつにすれば…!) 覚悟を決めた表情で両腕を『鯰』に向ける。 汁一本を放つ要領で波動の内圧を高めていく。圧力を徐々に右腕に集めていく。同時に左腕にも。 千の衝撃波を高速で放つ力が今、そのふたつの両極に集中していく。汁一本が単発で汁千本の1000倍の威力なら、単純に計算しても両手でその二倍、2000倍の威力だ。 右腕が内側からの圧力で破裂しそうになる。しかしまだ耐える。 続いて左腕も悲鳴をあげる。まだだ、耐えてくれ。 さらに力を凝縮。 二点集中。限界まで高く極限まで鋭く。 「もう抑えられん! い、今ダっ!! これがオレの極限の一撃っ! うおおおおっ!! 汁 一 極 !!」 凄まじい轟音。激しい閃光。音が聞こえるよりも速く、限界を超えた一撃は敵を貫き大爆発を起こした。さらに『鯰』の頭と片方の鰭を一瞬のうちに跡形もなく吹き飛ばした。 周辺は空襲でもあったかのように草木は焼け、大地は大きく抉られて、いかにその衝撃が凄まじいものだったかを如実に物語っている。 一方ゲンダーも想像を遥かに超える反動でただではすまない。ずいぶん長い距離を吹き飛ばされ、いやというほど地面に身体を打ちつけた。すでに何度か汁一本を発射していた右腕は、とうとう衝撃に耐えかねて大破してしまい、使い物にならなくなってしまった。 「うぐぐ……さすがに無茶ダったか。ダがこれが今のオレにできる最大の攻撃。どうダ、やったか!?」 その問に答える者はだれもいない。しかし、もしメイヴがこの場にいたのならこう言っただろう。 ――ゲンダー、それはやってないフラグですよ―― 地響きが。土煙の向こうから地響き伝わってくる。 土煙の向こうから姿を現したのは頭を吹き飛ばされ、内部の配線が剥き出しなってもなお跳ね続ける『鯰』だ。 「な、なんてことダ。まだ動けるのか」 『鯰』は大地を揺らしながら、少しずつゲンダーに近づいてくる。跳ねるたびにあちこち壊れてパーツを周囲にばら撒いているが、そんなことはお構いなしに標的と定めた相手を押し潰すことだけを考えて迫り来る。 「あいつ化け物か!? まるでゾンビみたいダ」 このままでは踏みつぶされてしまう……逃げなくては。 しかし、汁一極の反動でゲンダーは仰向けに倒れたまま立つことすらままならない。 汁一極の衝撃でどこかへ吹き飛ばされていたグメーが戻ってきた。事態を把握したグメーは動けないゲンダーをなんとか避難させようとゲンダーの右腕を必死に引っ張るが、グメーが掴んだ部分は粉のようになって風に飛ばされてしまった。触れたものを消滅させる特性のせいでグメーはものを掴むことができない。 「無理するな、グメー。オレのことは大丈夫ダ。おまえだけでも早く逃げろ…」 しかし、誰の目にも無理をしているように見えるのはゲンダーのほうだった。グメーはうろたえている。 そんな間にも、『鯰』はどんどん距離を詰めてくる。たとえ敵の姿が見えていなくても、大きくなる揺れがそれをいやでも感じさせてくれる。 わかる。もうすぐそこまで迫っている。 (こんどこそおしまいダな。すまない、メイヴ。やはりオレには……) 仰向けに倒れたゲンダーの視界を影が覆う。最後に視界に入った『鯰』はもはや原形を留めていなかった。 グメーは最期のそのときまでゲンダーのそばを離れようとしない。その小さな身体で震えながらも必死にゲンダーを庇おうとしている。 (グメーもすまない。頼んダわけでもないのに、おまえは最後までオレについてきてくれるのか。でもいいんダ。もういい、グメー。おまえまで一緒にやられることはない) 最後の力を振り絞って、辛うじて動かせた左腕でグメーを叩き飛ばした。これで左腕も消滅してしまったが、もうそんなことはどうでもいい。せめてグメーだけでも無事であってくれればそれでよかった。 叩き飛ばされたグメーが草むらに落ちるのとほぼ同時に、ドスンという鈍い音が響く。 ゲンダーが倒れていた場所には、『鯰』だったものの残骸が重くのしかかっていた。 「グ……グメェェェエエェェェーーーっっっ!!!」 グメーの悲痛な叫びが虚しく響き渡る―― 第18章 了 ブラックボックス19